<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

// esta funcao cria a estrutura de um template do sistema e
// compara com a pasta passada por parametro.
function isTemplate($folder) {
  $template = array(
    'index.html',
    '_inc' => array(
      'index.html',
      'header.php',
      'footer.php'
    ),
    'access' => array(
      'index.html',
      'redirect.php',
      'login.php'
    ),
    'administrador' => array(
      'index.html',
      'settings.php',
      'home.php',
      'editarPerfil.php',
      'listarPerfil.php',
      'cadastrarPerfil.php',
      'criarPerfil.php'
    ),
    'user' => array(
      'index.html',
      'home.php'
    )
  );
  return folder1ContainedInFolder2($template, $folder);
}

// retira e retorna as folhas (arquivos) de uma pasta
function extractLeaves(&$folder) {
  $leaves = array();
  foreach ($folder as $key => $value) {
    // se nao for string, entao eh folha (arquivo)
    if (!is_string($key)) {
      $leaves[] = $value;
      unset($folder[$key]);
    }
  }
  return $leaves;
}

// retorna TRUE se tudo o que ha na primeira pasta tambem ha na segunda
function folder1ContainedInFolder2($folder1, $folder2) {
  // retira as folhas (arquivos) das pastas e coloca em variaveis
  $leaves1 = extractLeaves($folder1);
  $leaves2 = extractLeaves($folder2);
  
  // faz a comparacao entre as subpastas das duas pastas
  foreach ($folder1 as $key1 => $value1) {
    // eh necessario marcar a subpasta atual do loop como nao verificada
    $folder1[$key1]['found'] = FALSE;
    
    // compara a subpasta atual da primeira pasta com as subpastas da segunda
    foreach ($folder2 as $key2 => $value2) {
      // enquanto as chaves (nome das subpastas) nao
      // baterem, continua procurando
      if ($key2 != $key1)
        continue;
      
      // ao encontrar subpasta de mesmo nome, caso haja diferenca, tem diferenca
      if (!folder1ContainedInFolder2($value2, $value1))
        return FALSE;
      
      // caso nao haja diferenca na subpasta de mesmo nome, marca a
      // subpasta da primeira pasta como verificada e interrompe a busca
      $folder1[$key1]['found'] = TRUE;
      break;
    }
    
    // caso nao tenha sido encontrada pasta igual, tem diferenca
    if (!$folder1[$key1]['found'])
      return FALSE;
  }
  
  // como todas as subpastas daqui para baixo sao iguais, falta
  // olhar as folhas (arquivos) deste nivel
  $diff = array_diff($leaves1, $leaves2);
  return (is_array($diff) && !count($diff));
}

// pega as pastas de template disponiveis no sistema
function getTemplateFolders() {
  $directories = directory_map('application/views');
  foreach ($directories as $key => $value) {
    // se for subpasta e for template, disponibiliza
    if (is_string($key) && isTemplate($value))
      $directories[$key] = $key;
    
    // senao, retira do array
    else
      unset($directories[$key]);
  }
  return $directories;
}
